# coding=utf-8
import logging
from .models import MenuModel, PermissionsModel
from django.db.models.signals import post_save
from django.dispatch import receiver

# 得到日志输出对象logger（因为写的有）
# 记录日志
logger = logging.getLogger('erp')  # 因为配置文件中只配置了erp和djiang的，所以只能选两个
# 权限
methods = {'POST': '新增', 'GET': '查询', 'PUT': '修改', 'DELETE': '删除', 'PATCH': '局部修改'}

''' 在不重写的menu的post的基础上，可以直接在写多一个类，方便和节省了几行代码，他是在模型保存后触发的 '''

''' 这里的Django的信号机制就是当调用sender（调用的MenuModel模型类）的post_save（新增）的时候就会触发 '''
# 用来接收信号的（把当前的菜单的权限插入进去）
# 加上装饰器才是真正的视图函数
# post_save当通过发送post请求的时候，如果在保存一个菜单的时候就会触发
# sender发送者就是模型类
''' post_save：在模型保存后触发的 '''
@receiver(post_save, sender=MenuModel)
def create_menu_permissions(sender, instance, created, **kwargs):
    '''
    创建信号监控函数，信号接收者收到之后会自动触发的，创建菜单资源对应的权限
    '''
    if created:
        logger.info('创建菜单资源对于的权限')
        if isinstance(instance, MenuModel):  # 判断当前的操作对象是不是MenuModel类型的
            # 判断如果是菜单的话
            if not instance.parent:  # 因为没有父菜单，那么menu就是功能模块菜单
                permission = PermissionsModel.objects.create(name=instance.name + '的权限', is_menu=True)
                # 添加关联关系
                permission.menu = instance
                permission.save()
            # 否则如果是接口的话
            else:
                for method in methods.keys():
                    # 什么什么接口的什么什么操作的权限
                    permission = PermissionsModel.objects.create(name=f'{methods.get(method)}',
                                                                 desc=f'{instance.name}的{methods.get("method")}',
                                                                 is_menu=False, method=method, path=instance.url)
                    # 添加关联关系
                    permission.menu = instance
                    permission.save()
        else:
            logger.warning('当前对象不是MenuModel类型，所以不需要创建对应的权限')